home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-05-31 | 7.5 KB | 331 lines | [TEXT/KAHL] |
- /* gxShape tempShape;
-
- tempShape = GXCopyToShape(nil, hitShape);
- GXPrimitiveShape(tempShape);
- SetShapeCommonColor(oldShape, kBGColor);
- GXPrimitiveShape(oldShape);
- // Erase part of old shape
- GXDifferenceShape(oldShape, tempShape);
- GXDrawShape(oldShape);
- // Draw new
- GXDrawShape(hitShape);
- GXDisposeShape(tempShape);
- */
-
-
- void TrackOpShape(short whichShape, gxPoint *clickPt, gxHitTestInfo *hitStats)
- {
- gxPoint pt, lastPt = *clickPt, anchor;
- gxShape dragShape = gOpShapes[whichShape], tempShape;
- fixed theLine[4];
- Boolean redraw;
-
-
- // Set up
- switch(gSymmetry)
- {
- case p1:
- p1_GetRefPoint(dragShape, &anchor);
- break;
-
- case pg: // these are all pairs of vertical line shapes
- case pm:
- case cm:
- pg_GetRefPoint(dragShape, &anchor);
- break;
-
- case p2:
- p2_GetRefPoint(dragShape, &anchor);
- break;
-
- default:
- break;
- }
-
- if(!gContRedraw)
- {
- tempShape = GXCopyToShape(nil, dragShape);
- }
-
- // Follow the drag around
- while(StillDown())
- {
- GXGetViewPortMouse(0, &pt);
- if(pt.x != lastPt.x || pt.y != lastPt.y)
- {
- // Save old shape so we can erase and draw in rapid succession
- if(!gContRedraw)
- {
- GXCopyToShape(tempShape, dragShape);
- }
-
- // move the shape appropriately
- switch(gSymmetry)
- {
- case p1: // Track translation arrow head
- p1_DragOpShape(dragShape, &pt, &anchor);
- redraw = true;
- break;
-
- case pg: // lines moving horizontally only
- case pm:
- case cm:
- pg_DragOpShape(dragShape, &pt, &anchor);
- redraw = true;
- break;
-
- case p2:
- p2_DragOpShape(dragShape, &pt, &anchor);
- redraw = true;
- break;
-
- default:
- break;
- }
-
- if(redraw)
- {
- redraw = false;
- if(gContRedraw)
- {
- // Reset pattern and draw it right now
- LatticeChanged();
- GXDrawShape(gOffScreen.draw);
- }
- else
- {
- /* gxShape primDrag;
-
- primDrag = GXCopyToShape(nil, dragShape);
- SetShapeCommonColor(primDrag, kBGColor);
- GXPrimitiveShape(primDrag);
- GXPrimitiveShape(tempShape);
- GXDifferenceShape (tempShape, primDrag);
- GXDrawShape (tempShape);
- GXDisposeShape(primDrag);
- */
- // Erase and draw
- EraseAShape(tempShape);
- GXDrawShape(dragShape);
- }
- }
-
- }
- lastPt = pt;
- }
- if(!gContRedraw)
- {
- GXDisposeShape(tempShape);
- LatticeChanged();
- }
- }
-
-
- Boolean IsVectorPoint(long ptIndex);
- void GetVectorPoint(short whichPt, point *thePt);
- void SetVectorPoint(short whichPt, point *thePt);
-
- // Returns true if the given point is one of the vector-determining points
- // in the dragger, false otherwise
- Boolean IsVectorPoint(long ptIndex)
- {
- return( ptIndex == gDragger.Odex ||
- ptIndex == gDragger.Udex ||
- ptIndex == gDragger.Vdex );
- }
-
- // Returns a vector-determining point
- void GetVectorPoint(short whichPt, point *thePt)
- {
- if(whichPt == gDragger.Odex)
- GetShapePoints(gDragger.snake1, gDragger.Odex, 1, thePt);
- else if(whichPt == gDragger.Vdex)
- GetShapePoints(gDragger.snake1, gDragger.Vdex, 1, thePt);
- else if(whichPt == gDragger.Udex)
- GetShapePoints(gDragger.snake1, gDragger.Udex, 1, thePt);
- }
-
- void SetVectorPoint(short whichPt, point *thePt)
- {
- if(whichPt == gDragger.Odex)
- SetShapePoints(gDragger.snake1, gDragger.Odex, 1, thePt);
- else if(whichPt == gDragger.Vdex)
- SetShapePoints(gDragger.snake1, gDragger.Vdex, 1, thePt);
- else if(whichPt == gDragger.Udex)
- SetShapePoints(gDragger.snake1, gDragger.Udex, 1, thePt);
- }
-
-
-
-
- -----------------------------------------------------------------------
- // point constraining variables
- long slaveIndex = -1;
- point slavePt;
- long slaveConstraint = constrainNone;
- fixed hOffset, vOffset;
-
- // Set up point constraints if a vector-determining point
- if(isVectorPoint)
- {
- /* switch(gSymmetry)
- {
- case p1: // No constraints
- break;
-
- // Slave the origin to the end points, don't drag origin
- case pg:
- case cm:
- if(dragPtIndex == gDragger.Odex) // Can't drag origin
- {
- SysBeep(10);
- return;
- }
- else
- {
- if(dragPtIndex == gDragger.Udex)
- slaveConstraint = constrainV;
- else
- slaveConstraint = constrainH;
- slaveIndex = gDragger.Odex;
- }
- break;
-
- // Slave the origin to V and vice versa
- case pm:
- if(dragPtIndex != gDragger.Udex) // U is the only vector point not constrained
- {
- slaveConstraint = constrainH;
- if(dragPtIndex == gDragger.Odex)
- slaveIndex = gDragger.Vdex;
- else
- slaveIndex = gDragger.Odex;
- }
- break;
-
- // O_ point is active: Slave O_ to any other point
- case p2:
- if(dragPtIndex == gDragger.Odex)
- {
- slaveConstraint = constrainO_;
- slaveIndex = gDragger.O_dex;
- }
- else
- {
- // slave O_ to U or V
- slaveConstraint = constrainBoth;
- slaveIndex = gDragger.O_dex;
- }
- break;
-
- default:
- break;
- }
-
- // Get the actual slave point and set up offsets
- if(slaveConstraint & constrainBoth)
- {
- point dragPt;
-
- GetVectorPoint(slaveIndex, &slavePt);
- GetVectorPoint(dragPtIndex, &dragPt);
- hOffset = slavePt.x - dragPt.x;
- vOffset = slavePt.y - dragPt.y;
- }
- } */
- ---------------------------------------------------------------------
- ---------------------------------------------------------------------
-
- // Set the slave, if there is one
- /* if(slaveIndex >= 0)
- {
- if(slaveConstraint & constrainBoth)
- {
- // Check for the bits individually
- if(slaveConstraint & constrainH)
- slavePt.x = pt.x + hOffset;
- if(slaveConstraint & constrainV)
- slavePt.y = pt.y + vOffset;
- }
-
- // Always a vector point, if slaved
- SetVectorPoint(slaveIndex, &slavePt);
- }
- */
-
- ---------------------------------------------------------------------
- ---------------------------------------------------------------------
-
- point origin, temp;
-
- /* GetVectorPoint(gDragger.Odex, &origin);
- switch(gSymmetry)
- {
- case p1: // no constraints
- break;
-
- case pg: // must be rectangular, one contour V to U
- // Force rectangular
- GetVectorPoint(gDragger.Udex, &temp);
- temp.y = origin.y;
- SetVectorPoint(gDragger.Udex, &temp);
- GetVectorPoint(gDragger.Vdex, &temp);
- temp.x = origin.x;
- SetVectorPoint(gDragger.Vdex, &temp);
- break;
-
- case pm: // V below O
- case cm: // rectangular
- // Force V below O
- GetVectorPoint(gDragger.Vdex, &temp);
- temp.x = origin.x;
- SetVectorPoint(gDragger.Vdex, &temp);
- if(gSymmetry == cm)
- {
- // Force horizontal, too.
- GetVectorPoint(gDragger.Udex, &temp);
- temp.y = origin.y;
- SetVectorPoint(gDragger.Udex, &temp);
- }
- break;
-
- default:
- DefaultTileAndPattern();
- break;
- } */
-
- ----------------------------------
- -_------------------------------------
-
-
-
- line extraLine;
-
- // Add lines to close off square tiles
- ctr = origin;
- extraLine.first = ctr;
- ctr.y += gPattern.v.y;
- extraLine.last = ctr;
- tempShape = NewLine(&extraLine);
- SetShapeParts(gTileShape, 0, selectToEnd, tempShape, breakLeftEdit);
- ctr = origin;
- ctr.x += gPattern.u.x / 2;
- extraLine.first = ctr;
- ctr.y += gPattern.v.y;
- extraLine.last = ctr;
- SetLine(tempShape, &extraLine);
- SetShapeParts(gTileShape, 0, selectToEnd, tempShape, breakLeftEdit);
- DisposeShape(tempShape);
-
- ==================
- // Add a line to close off tiles
- ctr = origin;
- extraLine.first = ctr;
- ctr.y += gPattern.v.y;
- extraLine.last = ctr;
- tempShape = NewLine(&extraLine);
- SetShapeParts(gTileShape, 0, selectToEnd, tempShape, breakLeftEdit);
- DisposeShape(tempShape);
-
-
-